「專案做到哪了?」
如果 AI 同事每次都說「請提供更多資料」,雖然沒有亂猜,但你大概還是得自己開表格,這樣的同事顯然不夠聰明。今天,我們就幫它準備一張查詢表單:填入專案代號,就能拿到進度。
這張表單叫 Workflow Tool,也就是一條能被呼叫的工作流程,今天的任務是先把工具做好、單獨測通,Day 7 再交給 Agent 使用。
例如輸入 AI,就從 Day 3 的 project_status 查到進度 35%;輸入不存在的代號,就回「找不到」。資料從表裡拿,不靠模型猜。
整條流程是「收專案代號 → 查 Data Table → 整理回覆」,使用的都是查詢操作,不會改資料。
先確認 Day 3 的 project_status 還在,而且 AI 只有一筆,progress 是數字 35,在這份表裡代表 35%。工作流程也建在同一個 n8n 專案裡,才方便選到這張表。
截圖沿用本系列的 n8n 2.35.3。今天不會呼叫模型,所以不用安裝 Ollama,也不用新增模型的 API key。
回到 Workflows,按 Create workflow,名稱填入:
Tool - Get Project Status

Tool - 只是方便辨認的名字,加上這個字不會自動讓 Agent 學會使用它,後面還要明確加入 Agent 的 Tools。
加入 When Executed by Another Workflow。這是等待另一條 workflow 呼叫的入口,搜尋節點時也可能看到 Execute Sub-workflow Trigger。
在 Input data mode 選 Define using fields below,按 Add field,填入:
projectKey
String

這就像表單上只有「專案代號」一格,查 AI 專案就填 AI。先保留入口的原名,後面的程式會用名稱找到它,詳見 n8n 子工作流程入口說明。
在入口後面接上 Data Table 節點,設定如下:
Row
Get
project_status
projectKey (string)
Equals
{{ $json.projectKey }}

{{ $json.projectKey }} 的意思是「用前一步收到的代號」。收到 AI 就查 AI,收到別的代號就查別的,不要把它寫死成 AI,也不要把整段當普通文字。
這裡用的是 Get,也就是讀取資料;Data Table 的操作差別可以查 n8n Data Table 說明。
切到 Data Table 的 Settings,打開 Always Output Data。

查不到時,原本會輸出 0 筆,後面的節點也就沒機會回答。打開這個選項,就算沒資料,也會交出一個空項目,讓下一步能回「找不到」。
想像同事去檔案室找文件,找不到也該回來說一聲,不能直接下班吧。
最後接上 Code 節點,改名為 整理專案狀態回覆,選擇:
Run Once for All Items
JavaScript
貼上以下程式碼:
const projectKey = $("When Executed by Another Workflow").first().json.projectKey;
const row = $input.first().json;
if (!row.projectKey) {
return [{
json: {
found: false,
projectKey,
message: "找不到這個專案,請確認 projectKey。"
}
}];
}
return [{
json: {
found: true,
projectKey: row.projectKey,
projectName: row.projectName,
progress: row.progress,
blocker: row.blocker || "",
riskLevel: row.riskLevel,
nextStep: row.nextStep,
owner: row.owner,
statusUpdatedAt: row.statusUpdatedAt
}
}];

found 就是「有沒有找到」。找到時回 true 和資料表內容,找不到就回 false、原本的代號和提示,後面接 Agent 時就能分辨兩種情況。
打開入口節點,在右側 OUTPUT 按 set mock data 或 Edit Output,切到 JSON 編輯,放入:
[
{
"projectKey": "AI"
}
]
按 Save 後,這份測試輸入會被釘選。只釘選入口,不要釘選 Data Table 或 Code,這樣後面才會真的查表、整理結果。
回畫布按 Execute workflow,再打開最後的 Code 節點。我這次拿到 found: true、projectName: AI 同事計畫、progress: 35,其餘欄位也來自 Data Table。

如果你在 Day 3 填了不同內容,結果應該跟你的表一致,不必硬湊成截圖的數字。
把入口的測試資料改成下面這筆,儲存後再執行一次:
[
{
"projectKey": "NO-SUCH-PROJECT"
}
]
這次流程仍成功,但輸出變成 found: false,並提示「找不到這個專案,請確認 projectKey。」沒有出現進度、名稱或風險等資料。

「查不到」也是正常結果,不等於系統壞了。這兩題的驗收可以直接對照:
| 輸入 | 應看到的結果 | 本次實測 |
|---|---|---|
AI |
found: true,欄位與表中資料一致 |
PASS,進度為 35 |
NO-SUCH-PROJECT |
found: false,保留查詢代號,不補出不存在的欄位 |
PASS,回覆找不到 |
回入口按 Unpin data,確認紫色釘選圖示消失,避免下次手動測試還在用舊樣本。釘選資料用於開發測試,正式執行會忽略它,詳見 n8n 釘選資料說明。
儲存 workflow。我這個版本的畫面另有 Publish,示範中使用版本名稱 Day 6 - 可查詢專案狀態,完成後顯示 Published。

留意這張截圖的入口仍有紫色圖釘,Published 不代表已取消釘選,跟做時要另外檢查。
這個範例先假設每個代號只有一筆資料,程式也只取第一筆;它還沒有處理重複資料或拒絕空白代號。今天驗證的是表中這兩題,不能直接當成所有輸入都沒問題。
做到這裡,查詢表單已經能用。Day 7 才輪到 Agent 填表:問它「AI 專案做到哪了?」,再看工具呼叫紀錄,確認它真的查到 35%,不是剛好猜中。